// fileService.js - 文件上传服务
import axios from 'axios'

// 创建axios实例，使用基础配置
const apiClient = axios.create({
  baseURL: '/api',
  timeout: 60000
  // 移除默认的Content-Type，让axios自动处理multipart/form-data
})

// 添加请求拦截器，处理认证
apiClient.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

/**
 * 上传文件 - 增强版本，确保可靠上传
 * @param {File} file - 要上传的文件
 * @returns {Promise<Object>} 包含文件URL和文件名的对象
 */
export const uploadFile = async (file) => {
  try {
    // 防御性检查，确保file有效
    if (!file) {
      throw new Error('无效的文件对象')
    }
    
    const formData = new FormData()
    formData.append('file', file)
    
    console.log('开始上传文件:', file.name || '未知文件名', '大小:', file.size || '未知大小')
    
    // 尝试多种可能的上传路径
    const uploadPaths = ['/api/file/upload', '/file/upload', '/upload']
    let response = null
    let lastError = null
    
    for (const path of uploadPaths) {
      try {
        console.log(`尝试上传路径: ${path}`)
        // 不手动设置Content-Type，让axios自动处理multipart/form-data和边界
        response = await apiClient.post(path, formData, {
          headers: {
            'Content-Type': 'multipart/form-data'
          },
          timeout: 30000 // 30秒超时
        })
        console.log('上传成功，收到响应:', response.data)
        break
      } catch (err) {
        console.error(`路径 ${path} 上传失败:`, err.response ? err.response.data : err.message)
        lastError = err
        // 只有404错误才继续尝试其他路径
        if (err.response && err.response.status !== 404) {
          break
        }
      }
    }
    
    if (!response) {
      const errorMsg = lastError?.response?.data ? JSON.stringify(lastError.response.data) : '无法连接到服务器'
      throw new Error(`上传失败: ${errorMsg}`)
    }
    
    // 确保返回的数据包含必要字段
    let result = response.data || {}
    
    // 处理各种可能的返回格式
    if (typeof result === 'string') {
      try {
        result = JSON.parse(result)
      } catch (e) {
        console.warn('响应不是有效的JSON，使用默认值')
        // 如果是纯文本响应，假设是文件路径
        result = {
          fileUrl: result,
          filename: file?.name || 'uploaded_file'
        }
      }
    }
    
    // 确保文件名存在
    if (!result.filename) {
      result.filename = file?.name || 'uploaded_file'
    }
    
    // 智能构建文件URL
    if (!result.fileUrl) {
      const filename = encodeURIComponent(result.filename)
      result.fileUrl = `/file/download/${filename}`
    }
    
    console.log('上传完成，返回结果:', result)
    return result
  } catch (error) {
    console.error('文件上传错误详情:', error)
    
    // 处理不同类型的错误
    let errorMessage = '文件上传失败'
    if (error.response) {
      // 服务器返回错误状态码
      errorMessage = `上传失败: ${error.response.status} ${error.response.statusText}`
      if (error.response.data) {
        if (typeof error.response.data === 'string') {
          errorMessage += ` - ${error.response.data}`
        } else if (error.response.data.message) {
          errorMessage += ` - ${error.response.data.message}`
        }
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      errorMessage = '服务器无响应，请检查网络连接或后端服务是否正常运行'
    } else {
      // 设置请求时发生错误
      errorMessage = `请求错误: ${error.message}`
    }
    
    // 抛出详细的错误信息
    throw new Error(errorMessage)
  }
}

/**
 * 下载文件 - 增强版本，确保可靠下载
 * @param {string} filename - 文件名
 * @param {string} fileUrl - 可选的文件URL，优先使用
 */
export const downloadFile = async (filename, fileUrl) => {
  try {
    console.log('开始下载文件:', filename, 'URL:', fileUrl)
    
    // 如果提供了完整的文件URL，直接使用
    if (fileUrl && (fileUrl.startsWith('http://') || fileUrl.startsWith('https://'))) {
      console.log('使用完整URL直接下载')
      // 创建下载链接
      const link = document.createElement('a')
      link.href = fileUrl
      link.download = filename || 'download'
      document.body.appendChild(link)
      link.click()
      
      // 清理
      setTimeout(() => {
        document.body.removeChild(link)
      }, 100)
      
      return { success: true }
    }
    
    // 尝试多种可能的下载路径
    let response = null
    const downloadPaths = []
    
    // 如果提供了相对路径URL
    if (fileUrl && fileUrl.startsWith('/')) {
      downloadPaths.push(fileUrl)
    }
    
    // 添加默认的下载路径
    const encodedFilename = encodeURIComponent(filename)
    downloadPaths.push(`/file/download/${encodedFilename}`)
    downloadPaths.push(`/download/${encodedFilename}`)
    
    let lastError = null
    
    for (const path of downloadPaths) {
      try {
        console.log(`尝试下载路径: ${path}`)
        response = await apiClient.get(path, {
          responseType: 'blob',
          headers: {
            'Accept': '*/*'
          }
        })
        console.log('下载成功')
        break
      } catch (err) {
        console.log(`路径 ${path} 下载失败:`, err.message)
        lastError = err
        // 如果不是404错误，可能是其他问题，直接退出循环
        if (err.response && err.response.status !== 404) {
          break
        }
      }
    }
    
    if (!response) {
      throw lastError || new Error('下载失败：无法找到文件或连接服务器')
    }
    
    // 创建下载链接
    const blob = new Blob([response.data])
    const url = window.URL.createObjectURL(blob)
    const link = document.createElement('a')
    
    // 设置下载文件名
    let downloadFilename = filename
    const contentDisposition = response.headers['content-disposition']
    if (contentDisposition && contentDisposition.includes('filename=')) {
      const filenameMatch = contentDisposition.match(/filename="?([^"]+)"?/)
      if (filenameMatch && filenameMatch[1]) {
        downloadFilename = filenameMatch[1]
      }
    }
    
    link.href = url
    link.download = downloadFilename
    document.body.appendChild(link)
    link.click()
    
    // 清理
    setTimeout(() => {
      document.body.removeChild(link)
      window.URL.revokeObjectURL(url)
    }, 100)
    
    return { success: true }
  } catch (error) {
    console.error('文件下载错误详情:', error)
    throw new Error('文件下载失败，请稍后重试')
  }
}